大家好,前兩日我們已經將簡單的範例都串起來,接下來我想將分享我試著將flask這個單一的服務,打包成一個dockerfile,有了dockerfile就能夠做成image。
這邊先附上幾條常用指令的功能說明
功能說明 | |
---|---|
FROM | 基本環境的IMAGE |
RUN | build image 時運行的指令 |
CMD | run container 時運行的指令 |
ENTRYPOINT | run container 固定一定會執行的指令 |
COPY | 複製文件到容器資料夾內 |
ADD | 複製文件到容器資料夾內,支援tar和url,複製 tar 壓縮文件時會自動解壓縮 |
VOLUME | 可以將容器中的資料夾掛載到本地資料夾中,可用來容器刪除時不想刪除的資料 |
EXPOSE | 開放服務的port,這邊只是寫出來讓人知道,實際上服務要開啟對外port還是要靠run -P的參數 |
ENV | 設定容器環境變數 |
WORKDIR | 設定工作目錄 |
USER | 指定執行命令的用戶,預設是root |
這是我要把flask的服務打包的dockfile
FROM python:3.6.8-alpine3.8
WORKDIR /2022IThome_env
COPY * .
RUN apk --update add python py-pip openssl ca-certificates py-openssl wget
RUN apk --update add --virtual build-dependencies libffi-dev openssl-dev python-dev py-pip build-base \
&& pip install --upgrade pip \
&& pip install -r requirements.txt \
&& apk del build-dependencies
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
EXPOSE 5000
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app", "--preload"]
這邊我「FROM」使用是3.6.8版本的python環境,那這邊安裝的環境也有再細分版本,這裡我使用的是較為輕量的alpine,然後透過「WORKDIR」將工作目錄設定為/2022IThome_env,將本機當下目錄的全部檔案「COPY」到前面設定容器中工作目錄的底下。
接著「RUN」build image前的一些指令,像是先安裝服務所需要的套件庫,「EXPOSE」告知我的服務對外的port,但只是一個聲明並未有真正效果,要開啟對外的port,在容器啟動時還是要用-p的參數,最後使用「CMD」下啟動服務的指令,這樣在啟動容器時啟動服務的指令也會執行。
以上是dockfile的一個流程以及大致內容,接下來我們來看看實際操作。
首先我們將寫好的dockerfile,透過docker build --no-cache -t flask .
build一個名稱叫做flask的image
可以在docker-desktop的images裡查看,當然也可以使用dokcer image ls
的指令docker run -it --rm -p 5000:5000 flask
把flask這個image run起來,透過-p將container的5000port對到外部5000port
容器啟動之後可以在這邊,直接用網頁打開,或者直接在網頁上打上url也可以
今天是透過dockerfile把flask包成image給run起來,明天我要將redis & celery & flask 包成一個image,裡面有3個容器組成一組。